﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ModeloMagiPack.Entidades;
using DALMagiPack.Funcionalidad;

namespace BLLMagiPack.Managers
{
    public class BLLCheque:BLLMagiPack
    {
        public Cheque TraerCheque(int idCheque)
        {
            DALMagiPack<Cheque> dalCheque = new DALMagiPack<Cheque>();
            List<Filtro> opciones = new List<Filtro>() { new Filtro() { Columna = NombresColumnas.IdCheque, Tipo = TipoFiltro.Equal } };

            return dalCheque.Traer(new Cheque() { IdCheque = idCheque }, opciones).FirstOrDefault();
        }

        public List<Cheque> TraerCheques(Cheque c)
        {
            DALMagiPack<Cheque> dalCheque = new DALMagiPack<Cheque>();
            List<Filtro> opciones = new List<Filtro>();
            List<Cheque> lista = dalCheque.Traer(c, opciones);
            return lista;
        }

        public List<Cheque> TraerCheques(string numero, bool esPropio)
        {
            DALMagiPack<Cheque> dalCheque = new DALMagiPack<Cheque>();
            List<Filtro> opciones = new List<Filtro>() {
                    new Filtro(){ Columna = NombresColumnas.Numero, Tipo = TipoFiltro.Like},
                    new Filtro(){ Columna = NombresColumnas.EsPropio, Tipo = TipoFiltro.Equal}
            };
            Cheque filtroCheque = new Cheque();

            if (numero != null && numero.Length > 0)
                filtroCheque.Numero = numero;
            filtroCheque.EsPropio = esPropio;

            List<Cheque> lista = dalCheque.Traer(filtroCheque, opciones);
            return lista;
        }

        public List<Cheque> TraerChequesPorCliente(int? idCliente)
        {
            DALMagiPack<Cheque> dalCheques = new DALMagiPack<Cheque>();
            List<Cheque> cheques = new List<Cheque>();

            return cheques;
        }

        public List<Cheque> TraerChequesPorLocalidad(int idLocalidad)
        {
            DALMagiPack<Cheque> dal = new DALMagiPack<Cheque>();
            Cheque parametros = new Cheque() { IdLocalidad = idLocalidad };
            List<Filtro> filtros = new List<Filtro>() { new Filtro(){ Columna = NombresColumnas.IdLocalidad, Tipo = TipoFiltro.Equal } };

            return dal.Traer(parametros, filtros);
        }

        public List<Cheque> TraerChequesPorCuentaBancaria(int idCuentaBancaria)
        {
            DALMagiPack<Cheque> dalCheque = new DALMagiPack<Cheque>();
            Cheque parametros = new Cheque() { IdCuentaBancaria = idCuentaBancaria };
            List<Filtro> opciones = new List<Filtro>() { new Filtro(){ Columna = NombresColumnas.IdCuentaBancaria, Tipo = TipoFiltro.Equal} };

            return dalCheque.Traer(parametros, opciones);
        }

        public List<Cheque> TraerChequesPorMovimiento(int idMovimiento)
        {
            List<Cheque> cheques = new List<Cheque>();
            BLLChequeMovimiento bllChequeMovimiento = new BLLChequeMovimiento();

            foreach (ChequeMovimiento item in bllChequeMovimiento.TraerAsignaciones(idMovimiento, null))
                cheques.Add(TraerCheque(item.IdCheque));

            return cheques;
        }

        public List<Cheque> TraerChequesPorFactura(int idFactura)
        {
            DALMagiPack<FacturaCheque> dalFacturaCheque = new DALMagiPack<FacturaCheque>();
            List<FacturaCheque> asignaciones = dalFacturaCheque.Traer(new FacturaCheque() { IdFactura = idFactura }, new List<Filtro>() { new Filtro(){ Tipo = TipoFiltro.Equal, Columna = NombresColumnas.IdFactura } });

            List<Cheque> cheques = new List<Cheque>();
            foreach (FacturaCheque item in asignaciones)
            {
                Cheque cheque = new BLLCheque().TraerCheque(item.IdCheque);
                cheques.Add(cheque);
            }

            return cheques;
        }

        public decimal CalcularSaldoActual()
        {
            List<Cheque> cheques = new BLLCheque().TraerCheques(new Cheque());
            
            decimal? pija = (from c in cheques
                             where new BLLMovimiento().TraerMovimientosPorCheque(c.IdCheque).Count == 0
                             && !new BLLOrdenFacturaProveedor().EstaAsignadoProveedor(c.IdCheque)
                             && c.Firmante != null && c.Firmante.Length > 0
                             select c.Importe).Sum();

            return (pija == null) ? 0:(decimal) pija;
        }

        public decimal CalcularSaldoActualPorMes(int mes)
        {
            List<Cheque> cheques = new BLLCheque().TraerCheques(new Cheque());

            decimal? pija = (from c in cheques
                             where new BLLMovimiento().TraerMovimientosPorCheque(c.IdCheque, mes).Count == 0
                             && !new BLLOrdenFacturaProveedor().EstaAsignadoProveedor(c.IdCheque, mes)
                             && c.FechaAdquisicion.Month == mes
                             select c.Importe).Sum();

            return (pija == null) ? 0 : (decimal)pija;
        }

        public void CargarCheque(Cheque nuevoCheque, List<ChequeObservacion> observaciones)
        {
            DALMagiPack<Cheque> dalCheque = new DALMagiPack<Cheque>();
            dalCheque.IniciarConexión();
            dalCheque.IniciarTransacción();

            DALMagiPack<ChequeObservacion> dalChequeObservacion = new DALMagiPack<ChequeObservacion>() { Connection = dalCheque.Connection, Transaction = dalCheque.Transaction };

            dalCheque.Insertar(nuevoCheque);

            foreach (ChequeObservacion item in observaciones)
            {
                item.IdCheque = nuevoCheque.IdCheque;
                dalChequeObservacion.Insertar(item);
            }

            dalCheque.ConfirmarTransacción();
            dalCheque.CerrarConexión();
        }

        public void ModificarCheque(Cheque cheque, List<ChequeObservacion> observaciones)
        {
            DALMagiPack<Cheque> dalCheque = new DALMagiPack<Cheque>();

            dalCheque.IniciarConexión();
            dalCheque.IniciarTransacción();

            DALMagiPack<ChequeObservacion> dalChequeObservacion = new DALMagiPack<ChequeObservacion>() { Connection = dalCheque.Connection, Transaction = dalCheque.Transaction };

            dalCheque.Modificar(cheque);

            ChequeObservacion filtro = new ChequeObservacion() { IdCheque = cheque.IdCheque };
            List<Filtro> opciones = new List<Filtro>() { new Filtro() { Columna = NombresColumnas.IdCheque, Tipo = TipoFiltro.Equal } };

            foreach (ChequeObservacion item in dalChequeObservacion.Traer(filtro, opciones))
                dalChequeObservacion.Eliminar(item);

            foreach (ChequeObservacion item in observaciones)
            {
                item.IdCheque = cheque.IdCheque;
                dalChequeObservacion.Insertar(item);
            }

            dalCheque.ConfirmarTransacción();
            dalCheque.CerrarConexión();
        }

        public void EliminarCheque(Cheque cheque)
        {
            DALMagiPack<Cheque> dalCheque = new DALMagiPack<Cheque>();

            dalCheque.IniciarConexión();
            dalCheque.IniciarTransacción();

            DALMagiPack<ChequeObservacion> dalChequeObservacion = new DALMagiPack<ChequeObservacion>() { Connection = dalCheque.Connection, Transaction = dalCheque.Transaction };

            ChequeObservacion filtro = new ChequeObservacion() { IdCheque = cheque.IdCheque };
            List<Filtro> opciones = new List<Filtro>() { new Filtro() { Columna = NombresColumnas.IdCheque, Tipo = TipoFiltro.Equal } };

            foreach (ChequeObservacion item in dalChequeObservacion.Traer(filtro, opciones))
                dalChequeObservacion.Eliminar(item);

            dalCheque.Eliminar(cheque);

            dalCheque.ConfirmarTransacción();
            dalCheque.CerrarConexión();
        }
    }
}
